package tree.binarySortedTree;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class Node {
    private int value;
    private Node left;
    private Node right;
    public Node(int value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }

    /**
     * 中序遍历
     */
    public void infixOrder() {
        if (this.left != null) {
            this.left.infixOrder();
        }
        System.out.println(this);
        if (this.right != null) {
            this.right.infixOrder();
        }

    }

    /**
     * @param node 每次要添加的值
     */
    public void add(Node node){
        if (node==null){
            return;
        }
        if (node.value<=this.value){
            if (this.left==null){ // this已为根节点
                this.left = node;
            }else {
                this.left.add(node);
            }
        }
        if (node.value>this.value){
            if (this.right==null){
                this.right = node;
            }else {
                this.right.add(node);
            }
        }
    }
    /**
     * 编写一个查找的方法，找到了需要查找节点的父亲，没找到返回null
     * 因为我们树是按照比节点小的往左放，比节点大的往右放。
     */
    public Node getRemoveParent(int value) {
        if (this.left!=null && this.left.value == value) {
            return this;
        }
        if (this.right!=null && this.right.value == value) {
            return this;
        }
        if (value < this.value) {
            if (this.left != null) {
                return this.left.getRemoveParent(value);
            } else {
                return null;
            }
        }
        if (value > this.value) {
            if (this.right != null) {
                return this.right.getRemoveParent(value);
            } else {
                return null;
            }
        }
        return null;
    }

    /**
     * 通过父亲找儿子
     */
    public Node getRemoveSon(int value){
        if(this==null){
            return null;
        }
        return (value>this.getValue())?this.right:this.left;
    }


}
